const Koa = require("koa");
const { koaBody } = require("koa-body"); // 解析请求体
const router = require("./router/index"); // 路由
const mongoMiddleware = require("./middleware/mongodb"); // mongodb中间件
const koaStatic = require("koa-static"); // 静态资源
const koaCors = require("@koa/cors"); // 跨域
const koaError = require("koa-json-error"); // 错误处理
const koaParameter = require("koa-parameter"); // 参数校验
const koaJwt = require("koa-jwt"); // jwt
const config = require("./config/config.default"); // 配置文件

const app = new Koa();

// 参数校验 加工过后 ctx会多一个verifyParams 方法
koaParameter(app);

// 跨域
app.use(koaCors());

// 静态资源
app.use(koaStatic("./static"));

// 中间件 解析请求体
app.use(
  koaBody({
    multipart: true, // 支持文件上传
    // 文件上传配置
    formidable: {
      // 上传文件存储路径
      uploadDir: "./static/uploads",
      // 保留文件扩展名
      keepExtensions: true,
      // 文件大小限制
      // maxFieldsSize: 2 * 1024 * 1024,
    },
  })
);

// 错误处理
app.use(
  koaError({
    format: (err, obj) => {
      if (obj.code === "INVALID_PARAM") {
        return {
          code: 40022,
          message: "参数校验失败",
        };
      }
      return {
        message: err.message || "服务器内部错误",
        code: err.code || 500000,
      };
    },
  })
);

// mongodb中间件
app.use(mongoMiddleware());

// 接口鉴权
app.use(
  koaJwt({
    secret: config.jwt.secret, // 密钥
  }).unless({
    path: [/^\/api\/(?!user)/], // 不需要鉴权的路由 ?!零宽断言负预测先行断言 表示后面不能出现user
  })
);

app.use(router.routes()).use(router.allowedMethods());

app.listen(9520, () => {
  console.log("Server is running on http://localhost:9520");
});
